Просмотр
XML документов
![](images/picture.gif)
Как уже
отмечалось, в отличии от HTML,
XML никак не
определяет способ
отображения и
использования описываемых
с его помощью элементов
документа, т.е.
программе-анализатору
предоставляется
возможность самой
выбирать нужное
оформление. Этого требует
принцип независимости
определения внутренней
структуры документа от
способов представления
этой информации. Например,
задавая в документе
элемент <flower>роза</flower>, мы лишь
указываем, что rose в данном
случае является цветком,
но информации о том, как
должен выглядеть данный
элемент документа на
экране клиента и должен ли
он отображаться вообще, в
таком определении нет.
Для того,
чтобы использовать данные,
определяемые элементами XML,
например, отображать их на
экране пользователя,
необходимо написать
программу-анализатор,
которая бы выполняла эти
действия. Уже сегодня
таких программ появилось
достаточное количество и у
разработчиков существует
возможность выбора
наиболее подходящей из них
для решения конкретных
проблем
Как уже
отмечалось ранее, в общем
случае, программы-
анализаторы можно
разделить на две группы:
верифицирующие(т.е.
использующие DTD-
описания для определения
корректности документа) и
не верифицирующие. Если Вы
создаете свой язык и
описываете его грамматику
на основе DTD, то
для анализа документов,
написанных на этом языке,
безусловно, потребуется
программа, проверяющая
корректность составления
документа. Но так как
использование DTD
в XML не является
обязательным, то любой
правильно оформленный
документ может быть
распознан и разобран
программой,
предназначенной для
анализа XML-
документов. В любом случае,
используя универсальные XML-
анализаторы, Вы можете
быть уверенным в том, что
если заданные в документе
конструкции языка
являются синтаксически
правильными, то
программа-анализатор
сможет правильно извлечь
определяемые ими элементы
документа и передать их
прикладной программе,
выполняющей необходимые
действия по отображению.
Т.е. после разбора
документа в большинстве
случаев, Вам
предоставляется объектная
модель, отображающая
содержимое Вашего
документа, и средства,
необходимые для работы с
ней (прохода по дереву
элементов). При этом в
некоторых анализаторах
способ представления
структуры документа
основывается на
спецификации DOM.
Поэтому у Вас появляется
также возможность
использовать строгую
иерархическую модель DOM
для построения
собственных документов.
Если речь
идет о способах
отображения информации,
хранящейся в XML,
то необходимо упомянуть
разрабатываемый в
настоящее время W3C
стандарт стилевых таблиц
для XML, которые
предназначены для
описания правил
отображения элементов XML.
Более подробно мы
поговорим об XSL чуть
позже.
![](images/picture.gif)
Если
на Вашем компьютере
установлен броузер Internet
Explorer 4 (или более
поздняя версия), то Вы
можете использовать
встроенный в этот броузер XML-
анализатор msxml в своих
сценариях, написанных на Java
Script ил VBScript,.
В настоящий момент
существуют две его
реализации, - одна
предназначена для
использования в виде
написанного на C++ ActiveX-
объекта(реализация на базе
COM- технологии)
другая, написанная на Java,
не зависит от платформы.
Оба анализатора не сложны,
имеют сравнительно
небольшой размер - msxml на
C++ занимает около 100k,
версия на Java - 127k.
Анализатор, написанный на
C++, в текущей реализации не
поддерживает DTD-
правил, более компактный и
быстрый, чем его Java-версия.
Оба они имеют поддержку
иностранных языков, т.е. в
составе Internet Explorer
C++- анализатор работает со
всеми языками,
"понимаемыми"
броузерами, а анализатор
на Java - с теми
языками, с которыми может
работать виртуальная Java-машина.
Т.к.
обе версии
разрабатывались
параллельно, объектная
модель, заложенная в
основу каждой из них,
внешне схожа, поэтому
больших сложностей при
переходе от одной версии к
другой обычно не
возникает.
Рассмотрим
основные свойства и
методы, доступные JavaScript-
сценарию в процессе его
выполнения на стороне
броузера. В наших примерах
мы будем использовать XML-
анализатор в сценариях Java
Script, т.к. этот способ
более понятен и быстрее
работает. Полное описание
C++ интерфейсов анализатора
доступны в документации по
Internet Client SDK
![](images/picture.gif)
Перед
тем, как использовать
свойства и методы
анализатора, его
необходимо создать.
Делается это при помощи
стандартного метода,
предназначенного для
создания ActiveX-
объектов:
var mydoc = new ActiveXObject("msxml");
Если
ActiveX- компонент
был зарегистрирован на
Вашей машине(или у Вас
установлен броузер Internet
Explorer 4), то в
результате выполнения
этой функции переменной
mydoc будет присвоен объект,
имеющий тип msxml,
свойства и методы которого
используются в дальнейшем
для получения доступа к
структуре XML-
документа.
Объектная
модель XML-
анализатора Microsoft может
быть представлена в виде
следующего набора
внутренних объектов: XML
Document, XML Element и Element
Collection. Объект XML
Document содержит
свойства и методы,
необходимые нам для работы
с XML- документом в
целом. XML Element отвечает
за работу с каждым из
элементов XML-
документа. Element Collection представляет
из себя набор элементов,
доступ к которым доступен
при помощи имени или
порядкового номера. В
следующих примерах мы
рассмотрим каждый из этих
объектов подробнее.
Свойства
и методы документа(объект
XML Document)
![](file:///C:/DEFAULT1/images/picture.gif)
URL |
Свойство,
доступное для записи и
чтения. Задает или
возвращает URL
обрабатываемого
документа. В случае
изменения этого
свойства текущий
документ уничтожается
и начинается загрузка
нового по указанному URL |
root |
Возвращает
корневой элемент XML-
документа |
charset |
Свойство,
доступное для записи и
чтения.Возвращает или
устанавливает
название текущее
кодировочной таблицы
согласно требованиям ISO. |
version |
Возвращает
номер версии XML |
doctype |
Возвращает
содержимое элемента !DOCTYPE |
createElement() |
Метод,
позволяющий создать
новый элемент, который
будет добавлен в
качестве дочернего
для текущего элемента
дерева. В качестве
первого параметра
задается тип элемента,
в качестве второго -
название элемента
xml.createElement(0,"new_element") |
fileSize |
Возвращает
размер XML-
документа. Это
свойство в C++- версии
анализатора еще не
реализовано |
fileModifiedDate |
Возвращает
дату последнего
изменения XML-
документа. Это
свойство в C++- версии
анализатора еще не
реализовано |
fileUpdatedDate |
Возвращает
дату последнего
обновления XML-
документа. Это
свойство в C++- версии
анализатора еще не
реализовано |
mimeType |
Возвращает MIME-тип(MIME- Multipurpose
Internet Mail Extension, RFC 1341).Это
свойство в C++- версии
анализатора еще не
реализовано |
Ниже
приведен фрагмент JavaScript-
сценария, использующего эти
методы и свойства для
вывода информации о
текущем документе:
var xmldoc = new ActiveXObject("msxml");
var xmlsrc = "http://localhost/xml/journal.xml";
xmldoc.URL = xmlsrc;
function viewProperties(){
this.document.writeln('<center><table width=90% >');
this.document.writeln('<tr>');
this.document.writeln('<td align="center" bgcolor="silver">Document URL</td>
<td align="center">'+xmldoc.URL+'</td></tr>');
this.document.writeln('<tr>');
this.document.writeln('<td align="center" bgcolor="silver">Document root</td>
<td align="center">'+xmldoc.root+'</td></tr>');
this.document.writeln('<tr>');
this.document.writeln('<td align="center" bgcolor="silver">Document doctype</td>
<td align="center">'+xmldoc.doctype+'</td></tr>');
this.document.writeln('<tr>');
this.document.writeln('<td align="center" bgcolor="silver">Document version</td>
<td align="center">'+xmldoc.version+'</td></tr>');
this.document.writeln('<tr>');
this.document.writeln('<td align="center" bgcolor="silver">Document charset</td>
<td align="center">'+xmldoc.charset+'</td></tr>');
this.document.writeln('</table></center>');
}
Свойства
и методы элементов
документа
![](file:///C:/DEFAULT1/images/picture.gif)
type |
Возвращает
тип элемента. Это
свойство может быть
использовано для того,
чтобы разделить имена
тэгов и данные,
содержащиеся внутри
них. В данной версии
анализатора
определены следующие
типы элементов:
0 - элемент
1 - текст
2 - комментарий
3 - Document
4 - DTD |
tagName |
Возвращает
или устанавливает
название тэга(в виде
строки с символами,
приведенными к
верхнему регистру).
Названия
метатэгов(например,
<?xml?>)
начинаются с символа ?.
Названия тэгов
комментариев
начинаются с символа !.
|
text |
Возвращает
текстовое содержимое
элементов и
комментариев. |
AddChild() |
Добавление
нового дочернего
элемента и всех его
потомков в текущую
ветвь дерева. В
качестве первого
параметра этой
функции необходимо
передать объект типа Element,
который затем будет
помещен в список
дочерних элементов.
Также необходимо
задать индекс нового
элемента в списке и в
качестве последнего
параметра обязательно
передать значение -1.
Т.к. в данной модели
любой элемент в
документе может иметь
ссылку только на один
родительский элемент,
при выполнении данной
процедуры у
добавляемого объекта
старая ссылка на
родительский элемент
теряется. Используя
это свойство, можно
перемещать элементы
из одного XML-
документа в другое, но
том случае, если у
дочерних ссылок
перемещаемого
элемента существуют
внешние ссылки или
сами дочерние
элементы ссылаются на
внешние возможно
возникновение ошибки
elem.addChild(elem.children.item().children.item(0),0,-1) |
removeChild() |
Удаляет
дочерний элемент и
всех его потомков.
Элементы остаются в
памяти и могут быть
вновь добавлены к
дереву при помощи
метода addChild().
elem.removeChild(elem.children.item(1)) |
parent |
Возвращает
указатель на текущий
родительский элемент.
Ссылки на
родительский элемент
имеют все элементы, за
исключением
корневого. |
GetAttribute() |
Возвращает
значение указанного
атрибута в виде
текстовой строки.
elem.getAttribute("color") |
SetAttribute() |
Устанавливает
указанный атрибут и
его значение. Прежнее
значение атрибута
теряется
elem.setAttribute("color","red") |
removeAttribute() |
Уничтожает
указанный атрибут
elem.removeAttribute("color") |
children |
Возвращает
ассоциированный
список дочерних
элементов(коллекцию).
Такой список
позволяет приложению
получать нужные
элементы как по
названию, так и по
порядковому номеру
при помощи метода item().
В том случае, если
потомков у текущего
элемента нет, функция
возвратит null |
назад
содержание
вперед
|